#define _CRT_SECURE_NO_WARNINGS
#include "func.h"
#define N 1001
int father[N];//记录每个顶点的父亲,0没有用

void init(int n)
{
    int i;
    for(i=1;i<=n;i++)
    {
        father[i]=i;
    }
}

int Find(int x)
{
    int fx=father[x];
    if(fx==x)
    {
        return fx;
    }else{
        return Find(fx);
    }
}

void UnionVertex(int x,int y,int *n)
{
    int fx=Find(x);
    int fy=Find(y);
    if(fx!=fy)
    {
        father[fy]=fx;
        --(*n);
    }
}

int main()
{
    int n,m;//n是顶点数，m多少条边
    int i,x,y;
    while (scanf("%d%d",&n,&m)!=EOF)
    {
        init(n);//初始化顶点，每个顶点看作一棵树，父亲是自己
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            UnionVertex(x,y,&n);//合并顶点
        }
        if(1==n)
        {
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }    
    return 0;
}